/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Extras;

import Gestores.GestorCliente;
import Hilos.HiloCliente;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Francisco
 */
public class ProcesadorMensajesCliente {

    private GestorCliente gestorCliente;
    private HiloCliente hiloCliente;

    public ProcesadorMensajesCliente(GestorCliente gestorCliente, HiloCliente hiloCliente) {
        this.gestorCliente = gestorCliente;
        this.hiloCliente = hiloCliente;
    }

    public synchronized void procesarMensaje(String mensajeDeServer) {
        LinkedList<String> mensajes = new LinkedList<>();
        String jugador, accion, mensaje = "";
        if (mensajeDeServer.contains(";")) {
            int indiceDePuntoYComaPosterior = mensajeDeServer.indexOf(";", 0);
            int indiceDePuntoYComaAnterior = 0;
            while (indiceDePuntoYComaPosterior != -1) {
                mensajes.add(mensajeDeServer.substring(indiceDePuntoYComaAnterior, indiceDePuntoYComaPosterior));
                indiceDePuntoYComaAnterior = indiceDePuntoYComaPosterior + 1;
                indiceDePuntoYComaPosterior = mensajeDeServer.indexOf(";", indiceDePuntoYComaAnterior);
                if (indiceDePuntoYComaPosterior == -1) {
                    mensajes.add(mensajeDeServer.substring(indiceDePuntoYComaAnterior));
                }
            }
        } else {
            mensajes.add(mensajeDeServer);
        }
        for (int i = 0; i < mensajes.size(); i++) {
            mensaje = mensajes.get(i);
//            int c = mensaje.indexOf("&");
            int a = mensaje.indexOf("-");
            int af = mensaje.indexOf("-", a + 1);
            int indexNicknameSiguienteOferta;
            int indexNicknameSiguienteAMostrar;
            String nicknameSiguienteOferta;
            String nicknameSiguienteAMostrar;
//            if (c != -1) {
//                gestorCliente.setNicknameUsado(false);
//                if (hiloCliente.esPrimeraVez()) {
//                    try {
//                        gestorCliente.notificar();
//                        wait();
//                    } catch (InterruptedException ex) {
//                        Logger.getLogger(HiloCliente.class.getName()).log(Level.SEVERE, null, ex);
//                    }
//                    hiloCliente.setEsPrimeraVez(false);
//                }
//                gestorCliente.procesarJugadores(mensaje.substring(c));
//                return;
//            }
            if (a != -1) {//c == -1 &&
                jugador = mensaje.substring(0, a);
                accion = mensaje.substring(a + 1, af);
                String terreno, idTerreno;
                switch (accion) {
                    case "TiraLosDados":
                        gestorCliente.actualizarTurnoJugador(jugador);
                        if (hiloCliente.getNickname().equals(jugador)) {
                            gestorCliente.habilitarTirarDados();
                        }
                        break;
                    case "EstaPreso":
                        String puedePagarSalidaCarcel = mensaje.substring(af + 1);
                        gestorCliente.actualizarTurnoJugador(jugador);
                        if (hiloCliente.getNickname().equals(jugador)) {
                            String cond[] = puedePagarSalidaCarcel.split("/");
                            boolean pagar = Boolean.parseBoolean(cond[0]);
                            boolean suerte = Boolean.parseBoolean(cond[1]);
                            boolean arca = Boolean.parseBoolean(cond[2]);
                            boolean tercerIntento = Boolean.parseBoolean(cond[3]);
                            gestorCliente.mostrarOpcionesCarcel(pagar, suerte, arca, tercerIntento);
                        } else {
                        }
                        break;
                    case "TiroDados":
                        int total = Integer.parseInt(mensaje.substring(af + 1));
                        gestorCliente.informarResultadoDadosJugador(jugador, total);//gestorCliente.informarResultadoDadosJugador(nickname, total);
                        break;
                    case "CerroElJuego":
                        gestorCliente.cerroJuego(jugador);
                        break;
                    case "EnUso":
                        gestorCliente.setNicknameUsado(true);
                        gestorCliente.notificar();
                        gestorCliente.mostrarMensajeError("El nickname está en uso");
                        gestorCliente.eliminarHilo();
                        hiloCliente.setCerroServidor(true);//Para este hilo porque el nickname esta repetido. Usamos esta variable porque es justo lo q necesitamos
                        break;
                    case "PreguntarComprarTerreno":
                        String compra = mensaje.substring(af + 1);
                        String propiedad = mensaje.substring(0, a);
                        gestorCliente.mostrarDeseaComprar(compra, propiedad);
                        break;
                    case "Compro":
                        terreno = mensaje.substring(af + 1);
                        gestorCliente.adquirioTerreno(jugador, terreno);
                        break;
                    case "ComproEnSubasta":
                        int indicePagoDeSubasta = mensaje.indexOf("-", af + 1);
                        terreno = mensaje.substring(af + 1, indicePagoDeSubasta);
                        String pagoDeSubasta = mensaje.substring(indicePagoDeSubasta + 1);
                        gestorCliente.adquirioTerreno(jugador, terreno, pagoDeSubasta);
                        break;
                    case "GanoSubasta":
                        gestorCliente.terminarSubasta(jugador);
                        break;
                    case "Subasta":
                        idTerreno = mensaje.substring(0, a);
                        indexNicknameSiguienteOferta = mensaje.indexOf("-", af + 1);
                        indexNicknameSiguienteAMostrar = mensaje.indexOf("-", indexNicknameSiguienteOferta + 1);
                        int indexPrecioTerreno = mensaje.indexOf("-", indexNicknameSiguienteAMostrar + 1);
                        terreno = mensaje.substring(af + 1, indexNicknameSiguienteOferta);
                        nicknameSiguienteOferta = mensaje.substring(indexNicknameSiguienteOferta + 1, indexNicknameSiguienteAMostrar);
                        nicknameSiguienteAMostrar = mensaje.substring(indexNicknameSiguienteAMostrar + 1, indexPrecioTerreno);
                        String precioTerreno = mensaje.substring(indexPrecioTerreno + 1);
                        gestorCliente.habilitarSubasta(terreno, idTerreno, nicknameSiguienteOferta, nicknameSiguienteAMostrar, precioTerreno);
                        break;
                    case "Impuesto":
                        String mensajeImpuesto = mensaje.substring(af + 1);
                        gestorCliente.mostrarMensajeError(mensajeImpuesto);
                        break;
                    case "SubastaOferta":
                        String oferta;
                        indexNicknameSiguienteOferta = mensaje.indexOf("-", af + 1);
                        indexNicknameSiguienteAMostrar = mensaje.indexOf("-", indexNicknameSiguienteOferta + 1);
                        if (indexNicknameSiguienteOferta == -1) {
                            oferta = mensaje.substring(af + 1);
                            nicknameSiguienteOferta = "";
                            nicknameSiguienteAMostrar = "";
                        } else {
                            oferta = mensaje.substring(af + 1, indexNicknameSiguienteOferta);
                            nicknameSiguienteOferta = mensaje.substring(indexNicknameSiguienteOferta + 1, indexNicknameSiguienteAMostrar);
                            nicknameSiguienteAMostrar = mensaje.substring(indexNicknameSiguienteAMostrar + 1);
                        }
                        gestorCliente.procesarSubastaOferta(jugador, oferta, nicknameSiguienteOferta, nicknameSiguienteAMostrar);
                        break;
                    case "Historial":
                        String otraVariable = jugador + " " + mensaje.substring(af + 1);
                        gestorCliente.aniadirHistorial(otraVariable);
                        break;
                    case "ActualizaTablero":
                        int posicion = Integer.parseInt(mensaje.substring(af + 1));
                        gestorCliente.actualizarTablero(jugador, posicion);
                        break;
                    case "ActualizaDinero":
                        int dinero = Integer.parseInt(mensaje.substring(af + 1));
                        gestorCliente.disminuirDinero(jugador, dinero);
                        break;
                    case "TiraDadosXServicio":
                        String nickDuenio = mensaje.substring(af + 1);
                        gestorCliente.tirarDadosServicio(nickDuenio);
                        break;
                    case "MostrarTarjeta":
                        String nombreArchivo = mensaje.substring(af + 1);
                        gestorCliente.mostrarTarjeta(nombreArchivo);
                        break;
                    case "ActualizaTarjeta":
                        String tipo = mensaje.substring(af + 1);
                        gestorCliente.actualizarTarjetaCarcel(jugador, tipo);
                        break;
                    case "EnCarcel":
                        boolean carcel = Boolean.parseBoolean(mensaje.substring(af + 1));
                        gestorCliente.actualizarEstadoCarcel(jugador, carcel);
                        break;
                    case "listarPropiedadesJugador":
                        int tercerGuion = mensaje.indexOf("-", af + 1);
                        boolean esPorPreso = Boolean.parseBoolean(mensaje.substring(af + 1, tercerGuion));
                        String propiedades = mensaje.substring(tercerGuion + 1);
                        gestorCliente.listarPropiedadesHipoteca(propiedades, esPorPreso);
                        break;
                    case "ActualizaTableroHipoteca":
                        String propiedadesHipotecadas = mensaje.substring(af + 1);
                        gestorCliente.actualizarPropiedadesHipotecadas(jugador, propiedadesHipotecadas);
                        break;
                    case "listarPropiedadesHipotecadasJugador":
                        propiedades = mensaje.substring(af + 1);
                        gestorCliente.listarPropiedadesDeshipoteca(propiedades);
                        break;
                    case "ActualizaTableroDeshipoteca":
                        String propiedadesDeshipotecadas = mensaje.substring(af + 1);
                        gestorCliente.actualizarPropiedadesDeshipotecadas(jugador, propiedadesDeshipotecadas);
                        break;
                    case "MensajeEnPantalla":
                        String mensajeParaPantalla = mensaje.substring(af + 1);
                        gestorCliente.mostrarMensajeInfo(mensajeParaPantalla);
                        break;
                    case "estaRealizandoUnaAccion":
                        boolean realizandoAccion = Boolean.parseBoolean(mensaje.substring(af + 1));
                        gestorCliente.setHaciendoAlgo(jugador, realizandoAccion);
                        break;
                    case "listarPropiedadesConstruccionJugador":
                        propiedades = mensaje.substring(af + 1);
                        gestorCliente.listarPropiedadesConstruccion(propiedades, true);
                        break;
                    case "ActualizarCostrucciones":
                        propiedades = mensaje.substring(af + 1);
                        gestorCliente.actualizarConstrucciones(propiedades);
                        break;
                    case "listarPropiedadesDeconstruccionJugador":
                        propiedades = mensaje.substring(af + 1);
                        gestorCliente.listarPropiedadesConstruccion(propiedades, false);
                        break;
                    case "ListarPropiedadesDeCadaJugador":
                        propiedades = mensaje.substring(af + 1);
                        gestorCliente.listarPropiedadesCadaJugador(propiedades);
                        break;
                    case "PreguntarHipotecar":
                        propiedad = mensaje.substring(af + 1);
                        gestorCliente.preguntarHipotecar(propiedad);
                        break;
                    case "PreguntarVenderCasas":
                        propiedad = mensaje.substring(af + 1);
                        gestorCliente.preguntarVenderCasas(propiedad);
                        break;
                    case "PreguntarVenderHipotecar":
                        propiedad = mensaje.substring(af + 1);
                        gestorCliente.preguntarVenderHipotecar(propiedad);
                        break;
                    case "NoPuedeAdquirir":
                        propiedad = mensaje.substring(af + 1);
                        gestorCliente.noPuedeAdquirir(propiedad);
                        break;
                    case "HipotecaSub":
                        gestorCliente.hipotecaSub();
                        break;
                    case "AdquirioPropiedadesPorBancarrota":
                        propiedades = mensaje.substring(af + 1);
                        gestorCliente.adquirioTerrenos(jugador, propiedades);
                        break;
                    case "Bancarrota":
                        gestorCliente.bancarrota(jugador);
                        break;
                    case "preguntarDeshipotecarBancarrota":
                        String jugadorQueQuebro = mensaje.substring(af + 1);
                        if (hiloCliente.getNickname().equals(jugador)) {
                            gestorCliente.preguntarDeshipotecarPorBancarrota(jugadorQueQuebro);
                        }
                        break;
                    case "posesionesComerciar":
                        String posesiones = mensaje.substring(af + 1);
                        gestorCliente.listarPropiedadesOponenteComerciar(posesiones);
                        break;

                    case "posesionesComerciarPropias":
                        posesiones = mensaje.substring(af + 1);
                        gestorCliente.listarPropiedadesPropiasComerciar(posesiones);
                        gestorCliente.pedirPropiedadesOponenteComerciar(gestorCliente.llenarComboContrincantes());
                        break;
                    case "propuestaIntercambio":
                        int indexPropuestaDevolver = mensaje.indexOf("-", af + 1);
                        String mensajeArmado = mensaje.substring(af + 1, indexPropuestaDevolver);
                        String propuestaADevolver = mensaje.substring(indexPropuestaDevolver + 1);
                        gestorCliente.mostrarPropuestaIntercambio(mensajeArmado, propuestaADevolver);
                        break;
                    case "resultadoIntercambio":
                        String respuesta = mensaje.substring(af + 1);
                        gestorCliente.mostrarRespuestaIntercambio(respuesta);
                        break;
                    case "hipotecarPagar":
                        String montoAPagar = mensaje.substring(af + 1);
                        gestorCliente.hipotecarParaPagar(montoAPagar);
                        break;
                    case "gano":
                        gestorCliente.finJuego(jugador);
                        break;
                    case "mostrarOpcionesPagoSoloCasas":
                        gestorCliente.mostrarOpcionesPago(0);
                        break;
                    case "mostrarOpcionesPagoSoloHipotecas":
                        gestorCliente.mostrarOpcionesPago(1);
                        break;
                    case "mostrarOpcionesPagoAmbos":
                        gestorCliente.mostrarOpcionesPago(2);
                        break;
                }
            }
            if (mensaje.equals("ServidorCancelo")) {
                gestorCliente.cancelacionServidor();
                return;
            }
            if (mensaje.equals("Comenzar")) {
                gestorCliente.comenzarPartida();
            }
        }

    }

    public synchronized void notificarAll() {
        this.notifyAll();
    }
}
